package com.github.yogurt.core.dao;


import com.github.yogurt.core.po.BasePO;
import org.jooq.Condition;
import org.jooq.SortField;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.io.Serializable;
import java.util.List;

/**
 * @author jtwu
 */
public interface BaseDAO<T extends BasePO> {

	/**
	 * 保存
	 *
	 * @param po 持久化对象
	 */
	void save(T po);

	/**
	 * 更新
	 *
	 * @param po 持久化对象
	 */
	void update(T po);

	/**
	 * 根据主键查询
	 *
	 * @param id 主键
	 * @return po
	 */
	T findById(Serializable id);

	/**
	 * 查询所有
	 *
	 * @return 所有po
	 */
	List<T> findAll();


	/**
	 * 根据非空属性进行单表查询
	 *
	 * @param po 查询条件
	 * @return 符合条件单表集合
	 */
	List<T> find(T po);

	/**
	 * 根据非空属性进行单表查询
	 *
	 * @param condition  查询条件
	 * @param sortFields 排序字段
	 * @return 符合条件单表集合
	 */
	List<T> find(Condition condition, SortField... sortFields);

	/**
	 * 分页查询
	 *
	 * @param po       查询条件
	 * @param pageable 分页条件
	 * @return 分页集合
	 */
	Page<T> list(T po, Pageable pageable);


	/**
	 * 批量保存
	 *
	 * @param poList 持久化对象集合
	 */
	void batchSave(List<T> poList);


	/**
	 * 批量更新
	 *
	 * @param poList 持久化对象集合
	 */
	void batchUpdate(List<T> poList);

	/**
	 * 更新非空字段
	 *
	 * @param po 持久化对象
	 */
	void updateForSelective(T po);

	/**
	 * 根据条件更新非空字段
	 *
	 * @param po        持久化对象
	 * @param condition 条件字段
	 */
	void updateForSelective(T po, Condition condition);

}
